package fr.unice.poo.module;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;

import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;

import fr.unice.poo.application.Application;
import fr.unice.poo.application.Plugin;

public class Arborescence implements Plugin {

	BorderLayout bl = new BorderLayout();
	JTree arbre;
	DefaultMutableTreeNode racine;


	@Override
	public void plug(Application a, ActionEvent arg0) {
		a.setLayout(bl);

		File tree = new File("tree.sauv");
		if (!tree.exists()) {
			this.racine = new DefaultMutableTreeNode();
			for (File file : File.listRoots()) {
				// if file ne commence pas par un point
				DefaultMutableTreeNode lecteur = new DefaultMutableTreeNode(file.getAbsolutePath());	
				this.racine.add(lecteur);
			}
			// On cree, avec notre hierarchie, un arbre
			arbre = new JTree(this.racine);
			//Color pink = new Color(6565);;
			//arbre.setBackground(pink);
			Font f = new Font("Serif", Font.BOLD, 18);
			arbre.setFont(f);
			arbre.setRootVisible(false);
		}
		else {
			FileInputStream fichier;
			try {
				fichier = new FileInputStream("tree.sauv");
				// Get the object of DataInputStream
				DataInputStream in = new DataInputStream(fichier);
				BufferedReader br = new BufferedReader(new InputStreamReader(in));
				// Print the content on the console
				String str = br.readLine();
				String reset = "reset";
				System.out.println(reset.length());
				if(str.equals(reset) || str.equals("Doit persister") ){
					System.out.println("je dois pas persister");
					this.racine = new DefaultMutableTreeNode();
					for (File file : File.listRoots()) {
						// if file ne commence pas par un point
						DefaultMutableTreeNode lecteur = new DefaultMutableTreeNode(file.getAbsolutePath());	
						this.racine.add(lecteur);
					}
					// On cree, avec notre hierarchie, un arbre
					arbre = new JTree(this.racine);
					//Color pink = new Color(6565);;
					//arbre.setBackground(pink);
					Font f = new Font("Serif", Font.BOLD, 18);
					arbre.setFont(f);
					arbre.setRootVisible(false);
				}
				else{
					ObjectInputStream ois;
					try {
						System.out.println("Je persiste dans arbo");
						fichier = new FileInputStream("tree.sauv");
						ois = new ObjectInputStream(fichier);
						arbre = (JTree) ois.readObject();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (ClassNotFoundException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

				}
			}
			catch (FileNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		arbre.addTreeSelectionListener(new TreeSelectionListener() {

			public void valueChanged(TreeSelectionEvent event) {
				if (arbre.getLastSelectedPathComponent() != null) {

					File f = new File(arbre.getLastSelectedPathComponent().toString());

					if (f.isDirectory()) {
						File[] list = f.listFiles();
						for (File file : list) {

							DefaultMutableTreeNode lecteur = new DefaultMutableTreeNode(file.getAbsoluteFile());
							((DefaultMutableTreeNode) arbre.getLastSelectedPathComponent()).add(lecteur);
							arbre.repaint();
						}
					}
				}
			}
		});


		a.getContentPane().add(new JScrollPane(arbre));

		a.pluginActive.add(this);
		a.getContentPane().repaint();
		a.validate();
	}

	@Override
	public void unPlug(Application a, ActionEvent arg0) {
		// Ce plugin la n'est pas cense etre decharge

	}

	@Override
	public String getName() {
		return "Arborescence";
	}

	@Override
	public JTree getTree() {
		return this.arbre;
	}

}
